package com.edu.exam.entity.quality.audit;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 审核任务实体类
 * [所属模块] E-05 巡考管理模块
 *
 * <p>审核任务实体用于管理具体的审核任务，包括任务基本信息、分配信息、
 * 执行进度、结果记录等。支持任务的生命周期管理和状态跟踪。</p>
 *
 * <p>核心功能：
 * - 任务管理：管理审核任务的创建、分配、执行、完成等生命周期
 * - 进度跟踪：跟踪任务执行进度和状态变化
 * - 结果记录：记录审核结果和评分信息
 * - 异常处理：处理任务执行过程中的异常情况</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class AuditManagementTask {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 任务名称
     *
     * <p>审核任务的名称，用于标识和显示。
     * 应该简洁明了地描述任务的主要内容和目的。</p>
     */
    @Column(name = "task_name", nullable = false, length = 200)
    private String taskName;

    /**
     * 任务描述
     *
     * <p>审核任务的详细描述，说明任务的具体要求、
     * 执行标准、注意事项等信息。</p>
     */
    @Column(name = "task_description", columnDefinition = "TEXT")
    private String taskDescription;

    /**
     * 任务类型
     *
     * <p>审核任务的类型标识，用于区分不同类型的审核任务。
     * 支持的类型包括：REVIEW（审核）、VALIDATE（验证）、APPROVE（批准）、SIGN（签名）等。</p>
     */
    @Column(name = "task_type", nullable = false, length = 20)
    private String taskType;

    /**
     * 流程实例ID
     *
     * <p>所属审核流程实例的ID，关联audit_process_instance表。
     * 用于标识任务所属的审核流程实例。</p>
     */
    @Column(name = "process_instance_id", nullable = false)
    private Long processInstanceId;

    /**
     * 步骤实例ID
     *
     * <p>所属审核步骤实例的ID，关联audit_step_instance表。
     * 用于标识任务所属的审核步骤实例。</p>
     */
    @Column(name = "step_instance_id", nullable = false)
    private Long stepInstanceId;

    /**
     * 试卷ID
     *
     * <p>审核任务关联的试卷ID，关联papers表。
     * 用于标识审核任务的具体对象。</p>
     */
    @Column(name = "paper_id", nullable = false)
    private Long paperId;

    /**
     * 状态
     *
     * <p>审核任务的状态标识。
     * 支持的状态包括：CREATED（已创建）、ASSIGNED（已分配）、IN_PROGRESS（进行中）、COMPLETED（已完成）、REJECTED（已拒绝）、EXPIRED（已过期）等。</p>
     */
    @Column(name = "status", nullable = false, length = 20)
    private String status = "CREATED";

    /**
     * 分配人ID
     *
     * <p>任务分配给的审核人ID，关联系统用户表。
     * 用于标识任务的执行责任人。</p>
     */
    @Column(name = "assignee_id")
    private Long assigneeId;

    /**
     * 分配人姓名
     *
     * <p>任务分配给的审核人姓名，用于显示和记录。
     * 冗余存储用户姓名，避免频繁关联查询用户表。</p>
     */
    @Column(name = "assignee_name", length = 100)
    private String assigneeName;

    /**
     * 创建人ID
     *
     * <p>创建审核任务的用户ID，关联系统用户表。
     * 用于记录任务的创建责任人。</p>
     */
    @Column(name = "creator_id", nullable = false)
    private Long creatorId;

    /**
     * 创建人姓名
     *
     * <p>创建审核任务的用户姓名，用于显示和记录。
     * 冗余存储用户姓名，避免频繁关联查询用户表。</p>
     */
    @Column(name = "creator_name", nullable = false, length = 100)
    private String creatorName;

    /**
     * 截止日期
     *
     * <p>任务完成的截止时间，用于时间管理和提醒。
     * 超过此时间任务将被标记为逾期。</p>
     */
    @Column(name = "due_date")
    private LocalDateTime dueDate;

    /**
     * 优先级
     *
     * <p>任务的优先级标识，用于任务调度和资源分配。
     * 支持的优先级包括：LOW（低）、NORMAL（普通）、HIGH（高）、URGENT（紧急）等。</p>
     */
    @Column(name = "priority", nullable = false, length = 20)
    private String priority = "NORMAL";

    /**
     * 预估工时
     *
     * <p>完成任务所需预估工时，单位为小时。
     * 用于工作量和资源规划。</p>
     */
    @Column(name = "estimated_hours", precision = 5, scale = 2)
    private BigDecimal estimatedHours;

    /**
     * 实际工时
     *
     * <p>完成任务实际花费的工时，单位为小时。
     * 用于工作量统计和效率分析。</p>
     */
    @Column(name = "actual_hours", precision = 5, scale = 2)
    private BigDecimal actualHours;

    /**
     * 完成率
     *
     * <p>任务的完成进度百分比，取值范围0-100。
     * 用于跟踪任务执行进度。</p>
     */
    @Column(name = "completion_rate")
    private Integer completionRate = 0;

    /**
     * 分数
     *
     * <p>审核任务的评分，用于量化审核结果。
     * 具体评分标准根据任务类型而定。</p>
     */
    @Column(name = "score")
    private Integer score;

    /**
     * 最高分数
     *
     * <p>审核任务的最高可能分数。
     * 用于评分标准化和比较。</p>
     */
    @Column(name = "max_score")
    private Integer maxScore;

    /**
     * 结果摘要
     *
     * <p>审核结果的摘要信息，记录主要发现和结论。
     * 用于快速了解审核结果。</p>
     */
    @Column(name = "result_summary", columnDefinition = "TEXT")
    private String resultSummary;

    /**
     * 错误消息
     *
     * <p>任务执行过程中的错误信息。
     * 用于记录和诊断问题。</p>
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    /**
     * 重试次数
     *
     * <p>任务执行失败后的重试次数。
     * 用于错误恢复和流程管理。</p>
     */
    @Column(name = "retry_count")
    private Integer retryCount = 0;

    /**
     * 完成时间
     *
     * <p>任务实际完成的时间。
     * 用于统计分析和性能评估。</p>
     */
    @Column(name = "complete_time")
    private LocalDateTime completeTime;

    /**
     * 任务配置
     *
     * <p>JSON格式的任务详细配置参数。
     * 包含任务的执行参数、检查清单、评分标准等。</p>
     */
    @Column(name = "task_config", columnDefinition = "TEXT")
    private String taskConfig;

    /**
     * 任务参数
     *
     * <p>JSON格式的任务执行参数。
     * 包含任务执行过程中的动态参数和上下文信息。</p>
     */
    @Column(name = "task_params", columnDefinition = "TEXT")
    private String taskParams;

    /**
     * 结果数据
     *
     * <p>JSON格式的任务执行结果数据。
     * 包含详细的审核结果、证据材料、建议等。</p>
     */
    @Column(name = "result_data", columnDefinition = "TEXT")
    private String resultData;

    /**
     * 是否删除
     *
     * <p>软删除标记，标识记录是否已删除。
     * true表示已删除，false表示未删除。</p>
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    // ===== 常量定义 =====

    // 任务类型常量
    /** 任务类型 - 审核 */
    public static final String TYPE_REVIEW = "REVIEW";

    /** 任务类型 - 验证 */
    public static final String TYPE_VALIDATE = "VALIDATE";

    /** 任务类型 - 批准 */
    public static final String TYPE_APPROVE = "APPROVE";

    /** 任务类型 - 签名 */
    public static final String TYPE_SIGN = "SIGN";

    /** 任务类型 - 检查 */
    public static final String TYPE_CHECK = "CHECK";

    /** 任务类型 - 评估 */
    public static final String TYPE_ASSESS = "ASSESS";

    // 任务状态常量
    /** 任务状态 - 已创建 */
    public static final String STATUS_CREATED = "CREATED";

    /** 任务状态 - 已分配 */
    public static final String STATUS_ASSIGNED = "ASSIGNED";

    /** 任务状态 - 进行中 */
    public static final String STATUS_IN_PROGRESS = "IN_PROGRESS";

    /** 任务状态 - 已完成 */
    public static final String STATUS_COMPLETED = "COMPLETED";

    /** 任务状态 - 已拒绝 */
    public static final String STATUS_REJECTED = "REJECTED";

    /** 任务状态 - 已过期 */
    public static final String STATUS_EXPIRED = "EXPIRED";

    /** 任务状态 - 已取消 */
    public static final String STATUS_CANCELLED = "CANCELLED";

    // 优先级常量
    /** 优先级 - 低 */
    public static final String PRIORITY_LOW = "LOW";

    /** 优先级 - 普通 */
    public static final String PRIORITY_NORMAL = "NORMAL";

    /** 优先级 - 高 */
    public static final String PRIORITY_HIGH = "HIGH";

    /** 优先级 - 紧急 */
    public static final String PRIORITY_URGENT = "URGENT";

    // 默认工时常量（小时）
    /** 默认预估工时 - 2小时 */
    public static final BigDecimal DEFAULT_ESTIMATED_HOURS = BigDecimal.valueOf(2.0);

    /** 快速审核工时 - 1小时 */
    public static final BigDecimal FAST_AUDIT_HOURS = BigDecimal.valueOf(1.0);

    /** 紧急审核工时 - 0.5小时 */
    public static final BigDecimal URGENT_AUDIT_HOURS = BigDecimal.valueOf(0.5);

}